/*
 * Alex Rodrigo de Oliveira - 06/30403
 * Rafaela Porto Osório - 06/94011
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include "mqueue.h"


int mqueue_obtain(int key);
int mqueue_create(int key);


/*
 * Identificador da fila de mensagens para enviar ao deamon.
 */
int mqin;


/*
 * Identificador da fila de mensagens para receber resposta do deamon.
 */
int mqout;


/*
 * Número da fila de mensagens de envio ao executa_proc.
 */
static const int QUEUE_IN_KEY = 0630403;


/*
 * Número da fila de mensagens de resposta do executa_proc.
 */
static const int QUEUE_OUT_KEY = 064011;


/*
 * Cria a fila de mensagens para enviar mensagens ao deamon.
 */
int mqueue_create_in()
{
	return mqueue_create(QUEUE_IN_KEY);
}


/*
 * Cria a fila de mensagens para as respostas do deamon.
 */
int mqueue_create_out()
{
	return mqueue_create(QUEUE_OUT_KEY);
}


/*
 * Obtém a fila de mensagens que deve ser usada para enviar mensagens ao deamon.
 */
int mqueue_obtain_in()
{
	return mqueue_obtain(QUEUE_IN_KEY);
}


/*
 * Obtém a fila de mensagens a ser usada para receber mensagens do deamon.
 */
int mqueue_obtain_out()
{
	return mqueue_obtain(QUEUE_OUT_KEY);
}


/*
 * Cria a fila de mensagens. Se ela já existir, aborta o programa.
 */
int mqueue_create(int key)
{
	int msgid;

	msgid = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
	if(msgid == -1){
		perror("Não foi possível criar a fila de mensagens");
		exit(1);
	}
	return msgid;
}


/*
 * Tenta obter (mas não cria) a fila de mensagens.
 */
int mqueue_obtain(int key)
{
	int msgid;

	msgid = msgget(key, 0666);
	if(msgid == -1){
		perror("Não foi possível obter a fila de mensagens");
		puts("Parece que o executa_proc não criou a fila.");
		exit(1);
	}
	return msgid;
}
